'''
Created on 07/09/2013

@author: daniel
'''
import unittest
import colecciones.arbolGeneral
import colecciones.nodoGeneral

class RedDeAgua(colecciones.arbolGeneral.ArbolGeneral):
    
    def __init__(self,caudal):
        nodo=colecciones.nodoGeneral.NodoGeneral(caudal)
        colecciones.arbolGeneral.ArbolGeneral.__init__(self,nodo)
    
    
    def caudalMin(self):
        pass
    
    def caudalActual(self,raiz):
        padre=raiz.__esElPadre(self)
        if(padre==None):return raiz.getDatoRaiz()
        divisiones=padre.getHijos().getTamanio()
        return padre.caudalActual(raiz)/divisiones

    def __esElPadre(self,unNodo):#devuelve la rama de unNodo
        if(self.getHijos().esVacia()):return None
        if(self.getHijos().incluye(unNodo)):return self
        i=0
        while (i<self.getHijos().getTamanio()):
            if(self.getHijos().elemento(i).__esElPadre(unNodo)!=None):return self.getHijos().elemento(i)
            i+=1
        return None
    
    def caudalMinimo(self,raiz):
        if(self.getHijos().esVacia()):return self.getDatoRaiz()
        minCaud=self.caudalActual(raiz)
        i=0
        while (i<self.getHijos().getTamanio()):
            cand=self.getHijos().elemento(i).caudalMinimo(raiz)
            if((cand<minCaud)&(cand!=None)):minCaud=cand
            i+=1
        return minCaud



class Test(unittest.TestCase):


    def testInit(self):
        obj=RedDeAgua(1)
        self.assertIsInstance(obj, RedDeAgua, "Verifica creacion correcta")
  
    def testCaudalActual(self):
        obj=RedDeAgua(1000)
        nodo=RedDeAgua(None)
        nodo1=RedDeAgua(None)
        nodo1.agregarHijo(RedDeAgua(None))
        obj.agregarHijo(nodo)
        obj.agregarHijo(RedDeAgua(None))
        obj.agregarHijo(RedDeAgua(None))
        obj.agregarHijo(RedDeAgua(None))
        nodo.agregarHijo(nodo1)
        nodo.agregarHijo(RedDeAgua(None))
        self.assertTrue(obj.raiz.getHijos().incluye(nodo),"Verifica correcta inclusion de hijo")
        self.assertFalse(obj.raiz.getHijos().incluye(nodo1),"Verifica correcta no existencia de hijo")
        self.assertTrue(obj.getRaiz().getHijos().elemento(0).getHijos().incluye(nodo1),"Verifica correcta existencia de nieto")
        self.assertEquals(obj.getRaiz().getHijos().elemento(0).getHijos().elemento(0).getHijos().elemento(0).getDatoRaiz(),None,"Verifica correcta existencia de tatara nieto")
        print nodo1.caudalActual(obj)
        self.assertEquals(obj.caudalActual(obj),1000,"verifica el calculo del caudal por el nodo")
        self.assertEquals(nodo1.caudalActual(obj),250/2,"verifica el calculo del caudal por el nodo")

    def testCaudalMinimo(self):
        obj=RedDeAgua(1000)
        nodo=RedDeAgua(None)
        nodo1=RedDeAgua(None)
        nodo1.agregarHijo(RedDeAgua(None))
        obj.agregarHijo(nodo)
        obj.agregarHijo(RedDeAgua(None))
        obj.agregarHijo(RedDeAgua(None))
        obj.agregarHijo(RedDeAgua(None))
        nodo.agregarHijo(nodo1)
        nodo.agregarHijo(RedDeAgua(None))
        nodo.agregarHijo(RedDeAgua(None))
        self.assertTrue(obj.raiz.getHijos().incluye(nodo),"Verifica correcta inclusion de hijo")
        self.assertFalse(obj.raiz.getHijos().incluye(nodo1),"Verifica correcta no existencia de hijo")
        self.assertTrue(obj.getRaiz().getHijos().elemento(0).getHijos().incluye(nodo1),"Verifica correcta existencia de nieto")
        self.assertEquals(obj.getRaiz().getHijos().elemento(0).getHijos().elemento(0).getHijos().elemento(0).getDatoRaiz(),None,"Verifica correcta existencia de tatara nieto")
        print obj.caudalMinimo(obj)
        self.assertEquals(obj.caudalActual(obj),1000,"verifica el calculo del caudal por el nodo")
        self.assertEquals(nodo1.caudalActual(obj),250/3,"verifica el calculo del caudal por el nodo")
        self.assertEquals(obj.caudalMinimo(obj),250/3,"verifica el calculo del caudal por el nodo")
        
        
if __name__ == "__main__":
    #import sys;sys.argv = ['', 'Test.testName']
    unittest.main()